home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Commodities / KeyClick / src / beep.c next >
C/C++ Source or Header  |  1996-09-26  |  3KB  |  95 lines

  1. /*
  2.  * beep.c
  3.  *
  4.  * Ultra-simple beep, for keyclick
  5.  * MWS, 5/92.
  6.  *
  7.  * Hacked from audio1.c (RKM companion disks)...
  8.  * ...Copyright (c) 1990 Commodore-Amiga, Inc.
  9.  */
  10. #include <exec/types.h>        /* Some header files for system calls */
  11. #include <exec/memory.h>
  12. #include <devices/audio.h>
  13. #include <graphics/gfxbase.h>
  14. #include <proto/exec.h>
  15. #include <proto/dos.h>
  16. #include "beep.h"        /* prototypes */
  17.  
  18. static struct GfxBase *GfxBase;
  19. static UBYTE whichannel[] = {1, 2, 4, 8};
  20. static struct IOAudio *AIOptr;    /* Pointer to the IO block for IO commands   */
  21. static struct MsgPort *port;    /* Pointer to a port so the device can reply */
  22.  
  23. extern long samples, frequency, duration;
  24. UBYTE __chip waveptr[] = {  0, 60, 100, 127, 100, 60,
  25.                 0,-60,-100,-127,-100,-60  };
  26.  
  27. long clock = 3579545;    /* default to PAL if no GfxBase */
  28.  
  29. #define SAMPLES        (sizeof(waveptr))
  30. #define DURATION    15    /* milliseconds */
  31.  
  32. void
  33. FreeAudio ()            /* free allocated audio resources */
  34. {
  35.     if (AIOptr)
  36.     {
  37.         if (AIOptr->ioa_Request.io_Device)
  38.             CloseDevice ((struct IORequest *) AIOptr);
  39.         FreeMem (AIOptr, sizeof (struct IOAudio));
  40.         AIOptr = NULL;
  41.     }
  42.     if (port)
  43.     {
  44.         DeleteMsgPort (port);
  45.         port = NULL;
  46.     }
  47. }
  48.  
  49. BOOL 
  50. AllocAudio ()            /* allocate audio resources */
  51. {
  52.     if (GfxBase = (void *)OpenLibrary("graphics.library", 0L))
  53.     {
  54.         if (GfxBase->DisplayFlags & PAL)
  55.             clock = 3456895;
  56.         CloseLibrary(GfxBase);
  57.     }
  58.  
  59.     if ((AIOptr = (void *)AllocMem (sizeof (struct IOAudio), MEMF_PUBLIC | MEMF_CLEAR)) &&
  60.         (port = CreateMsgPort ()))
  61.     {
  62.         AIOptr->ioa_Request.io_Message.mn_ReplyPort = port;
  63.         AIOptr->ioa_Request.io_Message.mn_Node.ln_Pri = 0;
  64.         AIOptr->ioa_Request.io_Command = ADCMD_ALLOCATE;
  65.         AIOptr->ioa_Request.io_Flags = ADIOF_NOWAIT;
  66.         AIOptr->ioa_AllocKey = 85;
  67.         AIOptr->ioa_Data = whichannel;
  68.         AIOptr->ioa_Length = sizeof (whichannel);
  69.  
  70.         /** Open the audio device and allocate a channel **/
  71.         if (!OpenDevice ("audio.device", 0L, (struct IORequest *) AIOptr, 0L))
  72.             return TRUE;
  73.     }
  74.     FreeAudio ();
  75.     return FALSE;
  76. }
  77.  
  78. void
  79. beep (long volume, long frequency)
  80. {
  81.     static struct Message *msg;    /* Pointer for the reply message             */
  82.  
  83.     AIOptr->ioa_Request.io_Command = CMD_WRITE;
  84.     AIOptr->ioa_Request.io_Flags = ADIOF_PERVOL;
  85.     AIOptr->ioa_Data = (BYTE *) waveptr;
  86.     AIOptr->ioa_Length = SAMPLES;
  87.     AIOptr->ioa_Period = clock / (SAMPLES * frequency);
  88.     AIOptr->ioa_Cycles = (frequency * DURATION) / 1000;
  89.     AIOptr->ioa_Volume = volume;
  90.  
  91.     BeginIO ((struct IORequest *) AIOptr);
  92.     Wait (1L << port->mp_SigBit);
  93.     msg = GetMsg (port);
  94. }
  95.